/**
 * 
 */
package com.ms.game.itembox;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import com.ms.game.itembox.container.ItemBoxBin;
import com.xpec.c4.game.utility.GameUtility;

/**
 * 透過 dc 要求變更玩家道具的道具容器
 * 
 * @author TW15010
 */
public class ChangeItemLister implements Serializable {
	private static final long serialVersionUID = -189279348725684013L;

	/**
	 * 道具容器<br>
	 * key: key string, see {@link #createKey(String, String)}<br>
	 * value: changeItem
	 */
	private HashMap<String, ChangeItem> itemMap = new HashMap<String, ChangeItem>();

	/**
	 * 寄送禮物獲得道具時需要的寄送禮物訂單編號
	 */
	private ArrayList<String> sendGiftOrderIdList = new ArrayList<String>();
	
	/**
	 * 加入寄送禮物訂單編號, 因為寄送禮物獲得道具時要填<br>
	 * 因為寄送禮物而獲得道具的行為: {@link ItemChangeWay#isSendGiftRecvItem()}
	 * 
	 * @param orderId
	 */
	public void addSendGiftOrderId(String orderId) {
		if (!GameUtility.isHaveString(orderId)) {
			return;
		}

		sendGiftOrderIdList.add(orderId);
	}

	/**
	 * 建立放到 {@link #itemMap} 的 key
	 * 
	 * @param itemSn
	 *            道具序號
	 * @param itemId
	 *            道具id
	 * @return
	 */
	private String createKey(String itemSn, String itemId) {
		String sn = "";
		if (GameUtility.isHaveString(itemSn)) {
			sn = itemSn;
		}

		String id = "";
		if (GameUtility.isHaveString(itemId)) {
			id = itemId;
		}

		String key = sn + "_" + id;

		return key;
	}

	/**
	 * 加入一個要變更的道具項目
	 * <p>
	 * 增加物品時給 {@link ItemBoxBin} 裡面的道具 id<br>
	 * 減少物品時給道具序號<br>
	 * 如果因為寄送禮物的行為獲得道具, id 和序號都要給, 照著寄送清單理的道具資料填.
	 * 
	 * @param itemSn
	 *            道具序號
	 * @param itemId
	 *            道具 id
	 * @param changeCount
	 *            異動值，必須為大於零的值
	 * @param itemLevel
	 * 		                   道具等級，此欄位如果不是虛寶交易，填0就好了，不一定要特地填上去
	 * @return 成功: true<br>
	 *         失敗: false
	 */
	public boolean addItem(String itemSn, String itemId, int changeCount, int itemLevel ) {
		if (changeCount <= 0) {
			return false;
		}

		String key = createKey(itemSn, itemId);
		ChangeItem changeItem;

		// 如果沒有加過這個道具就新增
		if (!itemMap.containsKey(key)) {
			changeItem = new ChangeItem();
			itemMap.put(key, changeItem);
		} else { // 有的話就累加進去
			changeItem = itemMap.get(key);
		}

		changeItem.setItemSn(itemSn);
		changeItem.setItemId(itemId);
		changeItem.setChangeCount(changeItem.getChangeCount() + changeCount);
		changeItem.setItemRefineLevel(itemLevel);
	
		return true;
	}

	/**
	 * 取得幣別數量
	 * 
	 * @return 數量
	 */
	public int getSize() {
		return itemMap.size();
	}

	/**
	 * 取得清單的 Iterator
	 * <p>
	 * 透過 Iterator 向 {@link #getNextItem(Iterator)} 取得清單內所有的道具
	 * 
	 * @return Iterator
	 */
	public Iterator<Map.Entry<String, ChangeItem>> getListIterator() {
		return itemMap.entrySet().iterator();
	}

	/**
	 * 取得容器中的下一個個道具
	 * <p>
	 * 可以一直呼叫直到傳回 null 為止
	 * 
	 * @param it
	 *            透過 {@link #getListIterator()} 取得
	 * @return
	 */
	public ChangeItem getNextItem(Iterator<Map.Entry<String, ChangeItem>> it) {
		if (it == null) {
			return null;
		}

		if (it.hasNext()) {
			Map.Entry<String, ChangeItem> entry = it.next();
			return entry.getValue();
		}

		return null;
	}

	public HashMap<String, ChangeItem> getItemMap() {
		return itemMap;
	}

	public void setItemMap(HashMap<String, ChangeItem> itemMap) {
		this.itemMap = itemMap;
	}

	public ArrayList<String> getSendGiftOrderIdList() {
		return sendGiftOrderIdList;
	}
}
